﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Text;

namespace BreukTrainer_EE_.Controller
{
    class Accessor
    {
        public static System.Data.Linq.Table<Opdracht> GetOpdrachtTable()
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            return bodc.GetTable<Opdracht>();
        }

        public static System.Data.Linq.Table<OpdrachtDetail> GetOpdrachtDetailTable()
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            return bodc.GetTable<OpdrachtDetail>();
        }
        public static System.Data.Linq.Table<Leerling> GetLeerlingTable()
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            return bodc.GetTable<Leerling>();
        }
        public static System.Data.Linq.Table<LeerlingOpdracht> GetLeerlingOpdrachtTable()
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            return bodc.GetTable<LeerlingOpdracht>();
        }
        public static System.Data.Linq.Table<LeerlingOpdrachtDetail> GetLeerlingOpdrachtDetailTable()
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            return bodc.GetTable<LeerlingOpdrachtDetail>();
        }
        public static void insertLeerlingDetailOpdracht(string atekst, bool fout, long lid, long odi) {
            Table<LeerlingOpdrachtDetail> tblLod = Accessor.GetLeerlingOpdrachtDetailTable();
            LeerlingOpdrachtDetail lod = new LeerlingOpdrachtDetail();
            lod.AntwoordTekst = atekst;
            lod.fout = fout;
            lod.LeerlingID = lid;
            lod.OpdrachtDetailID = odi;
            tblLod.InsertOnSubmit(lod);
            tblLod.Context.SubmitChanges();
        }
        public static void insertLeerlingOpdracht(Leerling l, Opdracht o)
        {
            Table<LeerlingOpdracht> tblLeerOpd = Accessor.GetLeerlingOpdrachtTable();
            LeerlingOpdracht leerop = new LeerlingOpdracht();
            leerop.LeerlingID = l.LeerlingID;
            leerop.OpdrachtID = o.OpdrachtID;
            tblLeerOpd.InsertOnSubmit(leerop);
            tblLeerOpd.Context.SubmitChanges();
        }
        internal static void insertOpdrachtDetail(OpdrachtDetail od)
        {
            Table<OpdrachtDetail> tblOpdrDet = Accessor.GetOpdrachtDetailTable();            
            tblOpdrDet.InsertOnSubmit(od);
            tblOpdrDet.Context.SubmitChanges();
        }
        public static void createOpdracht(Opdracht o)
        {
            Table<Opdracht> tblOpdrachten = Accessor.GetOpdrachtTable();
            tblOpdrachten.InsertOnSubmit(o);
            tblOpdrachten.Context.SubmitChanges();
        }
        public static List<String> GetDistinctKlassen()
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            List<String> l = (from lln in bodc.GetTable<Leerling>().ToList<Leerling>()
                             select lln.Klas.ToString()).Distinct().ToList<String>();
            return l;            
        }
        public static List<Leerling> GetLeerlingen()
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            List<Leerling> l = bodc.GetTable<Leerling>().ToList<Leerling>();
            return l;
        }
        public static List<Leerling> getActiveLeerlingen() {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            var lln=from l in bodc.GetTable<Leerling>()
                    where (from llop in bodc.GetTable<LeerlingOpdracht>()
                          where llop.Afgewerkt == false && llop.LeerlingID == l.LeerlingID
                          select llop).Count()>0 
                    select l;
            return lln.ToList<Leerling>();
        }
        public static List<Leerling> getActiveLeerlingen(Opdracht o)
        {
            BreukOpgavesDataContext bodc = new BreukOpgavesDataContext();
            var lln = from l in bodc.GetTable<Leerling>()
                      where (from llop in bodc.GetTable<LeerlingOpdracht>()
                             where llop.Afgewerkt == false && llop.LeerlingID == l.LeerlingID && llop.Opdracht==o
                             select llop).Count() > 0
                      select l;
            return lln.ToList<Leerling>();
        }
        public static List<LeerlingOpdracht> getOpdrachten(long lid) { 
            var llnop=(from llop in GetLeerlingOpdrachtTable()
                       where llop.Afgewerkt==false && llop.LeerlingID==lid
                       select llop);
                return llnop.ToList<LeerlingOpdracht>();
        }
        public static bool isAfgewerkt(long lid, long oid) { 
            var afgewerkt=(from lo in GetLeerlingOpdrachtTable()
                          where lo.OpdrachtID==oid && lo.LeerlingID==lid   
                          select lo).Single<LeerlingOpdracht>().Afgewerkt;
            return (bool)afgewerkt;
        }

        internal static int GetCountOpdrachtDetails(long opdrachtid){
            var odtp = (from odt in GetOpdrachtDetailTable()
                         where odt.OpdrachtID == opdrachtid
                         select odt).Count<OpdrachtDetail>();
            return odtp;
        }
        public static List<Leerling> getLeerlingenFromKlas(String klas) {
            var lln = from l in GetLeerlingen()
                      where l.Klas==klas
                      select l;
            return lln.ToList<Leerling>();
        }
        public static List<OpdrachtDetail> getOpdrachtDetails(long oid) {
            var ods = (from od in GetOpdrachtDetailTable()
                       where od.OpdrachtID == oid
                       select od).ToList<OpdrachtDetail>();
            return ods;
        }
        private static List<LeerlingOpdracht> getLeerlingOpdrachten(long oid)
        {
            var los = (from lo in GetLeerlingOpdrachtTable()
                       where lo.OpdrachtID == oid
                       select lo).ToList<LeerlingOpdracht>();
            return los;
        }

        public static Leerling StringToLeerling(string s)
        {
            var leerling =  (from l in GetLeerlingTable()
                            where l.Naam == s
                            select l).Single<Leerling>();
            return leerling;
        }
        public static string getMaxScore(long opdrachtid) {
            var max = (from Opdracht o in GetOpdrachtTable()
             where o.OpdrachtID == opdrachtid
             select o).Single<Opdracht>().MaxScore.ToString();
            return max;
        }
        public static double getScore(long lid, long opdrachtid)
        {
            var aantaljuist = (from od in GetLeerlingOpdrachtDetailTable()
                               where od.OpdrachtDetail.OpdrachtID == opdrachtid && od.LeerlingID == lid && od.fout == false
                               select od).Count<LeerlingOpdrachtDetail>();
            var aantaltotaal = GetCountOpdrachtDetails(opdrachtid);
            var maxscore = getMaxScore(opdrachtid);
            Console.WriteLine(aantaljuist + " / " + aantaltotaal + " * " + maxscore);
            return (aantaljuist * Double.Parse(maxscore) / aantaltotaal);
        }

        internal static Opdracht getOpdrachtFromId(long id)
        {
            var opdracht = (from o in GetOpdrachtTable()
                            where o.OpdrachtID == id
                            select o).Single<Opdracht>();
            return opdracht;
        }

        public static void deleteOpdracht(long id)
        {
            BreukOpgavesDataContext db = new BreukOpgavesDataContext();
            var opdracht =  (from o in db.Opdrachts
                            where o.OpdrachtID == id
                            select o).Single<Opdracht>();
            if (opdracht.Status != true)
            {
                foreach (OpdrachtDetail od in opdracht.OpdrachtDetails)
                {
                    db.OpdrachtDetails.DeleteOnSubmit(od);
                }
                foreach (LeerlingOpdracht lo in opdracht.LeerlingOpdrachts)
                {
                    db.LeerlingOpdrachts.DeleteOnSubmit(lo);
                }
                db.Opdrachts.DeleteOnSubmit(opdracht);
                db.SubmitChanges();
            }
        }
    }
}
